#ifndef __ClefPublique
#define __ClefPublique

#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
#include <string.h>
#include <glib-2.0/glib.h>
#include <assert.h>
#include <time.h>

extern gmp_randstate_t state;

struct sClefPublique
{
    mpz_t n;
    mpz_t c;
    mpz_t m;
};
typedef struct sClefPublique ClefPublique;

/** @brief Initialise une clef publique*/
void ClefPubliqueInitialiser(ClefPublique **pClef);

/** @brief Retourne le premier champ d'une structure ClefPublique */
mpz_ptr ClefPubliqueGetn(/*const*/ClefPublique *pClef);

/** @brief Retourne le premier champ d'une structure ClefPublique en interdisant toutes modifications */
const mpz_ptr ClefPubliqueGetn2(const ClefPublique *pClef);

/** @brief Modifie le premier champ d'une structure ClefPublique*/
void ClefPubliqueSetn(ClefPublique *pClef, const mpz_t n1);

/** @brief Modifie le premier champ d'une structure ClefPublique a partir d'une chaine de caractere */
void ClefPubliqueStringSetn(ClefPublique *pClef, const char * n1);

/** @brief Retourne le deuxième champ d'une structure ClefPublique*/
mpz_ptr ClefPubliqueGetc(/*const*/ ClefPublique *pClef);

/** @brief Retourne le deuxième champ d'une structure ClefPublique en interdisant toutes modifications */
const mpz_ptr ClefPubliqueGetc2(const ClefPublique *pClef);

/** @brief Modifie le deuxième champ d'une structure ClefPublique*/
void ClefPubliqueSetc(ClefPublique *pClef, const mpz_t c1);

/** @brief Modifie le deuxième champ d'une structure ClefPublique a partir d'une chaine de caractere */
void ClefPubliqueStringSetc(ClefPublique *pClef, const char * c1);

/** @brief Retourne le troisième champ d'une structure ClefPublique */
mpz_ptr ClefPubliqueGetm(/*const*/ ClefPublique *pClef);

/** @brief Modifie le troisième champ d'une structure ClefPublique */
void ClefPubliqueSetm(ClefPublique *pClef, const mpz_t m1);

/** @brief Genère une clef publique */
ClefPublique * ClefPubliqueGenerer();

/** @brief Affiche la clef publique */
void ClefPubliqueAfficher(const ClefPublique * pClefPublique);

/** @brief Libère une structure ClefPublique */
void ClefPubliqueLiberer(ClefPublique * pClefPublique);

/** @brief Test le module clef publique */
void testRegressionClefPublique();

#endif
